#ifndef CMD_DDZ_HEAD_FILE
#define CMD_DDZ_HEAD_FILE

//////////////////////////////////////////////////////////////////////////
//公共宏定义
#include "Game/Game/GameDefine.h"
#pragma pack(1)

//参数定义
#define INVALID_CHAIR				0xFFFF								//无效椅子
#define INVALID_TABLE				0xFFFF								//无效桌子

//结束原因
#define GER_NO_PLAYER				0x10								//没有玩家

#define GAME_PLAYER					3									//游戏人数

//数目定义

#define MAX_COUNT					20									//最大数目
#define FULL_COUNT					54									//全牌数目

//逻辑数目
#define NORMAL_COUNT				17									//常规数目
#define DISPATCH_COUNT				51									//派发数目
#define BANKER_COUNT				3									//底牌数目

#define GAME_RULE_ROB_DIZHU			1									// 抢地主
#define GAME_RULE_GET_DIZHU			2									// 叫地主
#define GAME_RULE_3PLAYER			3									// 三人玩法
#define GAME_RULE_4PLAYER			4									// 四人玩法
#define GAME_RULE_JOKER				8									// 四人玩法

#define MAX_GAME_RULE				4

//服务器命令结构
#define SUB_S_GAME_START			100									//游戏开始
#define SUB_S_CALL_SCORE			101									//用户叫分
#define SUB_S_BANKER_INFO			102									//庄家信息
#define SUB_S_OUT_CARD				103									//用户出牌
#define SUB_S_PASS_CARD				104									//用户放弃
#define SUB_S_GAME_CONCLUDE			105									//游戏结束
#define SUB_S_SET_BASESCORE			106									//设置基数
#define SUB_S_OUTPLAYER				107									//用户淘汰
#define SUB_S_RAPIDMODE				108									//AI快速模式

//游戏状态
#define GAME_SCENE_FREE				GAME_STATUS_FREE					//等待开始
#define GAME_SCENE_CALL				(GAME_STATUS_FREE + 50)				//叫分状态
#define GAME_SCENE_PLAY				GAME_STATUS_PLAY					//游戏进行

#define GET_DIZHU_SCORE1			1									//一分
#define GET_DIZHU_SCORE2			2									//二分
#define GET_DIZHU_SCORE3			3									//三分

//空闲状态
struct CMD_S_StatusFree
{
	//游戏属性
	LONGLONG							lCellScore;							//基础积分

	//历史积分
	SCORE							lTurnScore[GAME_PLAYER];			//积分信息
	SCORE							lCollectScore[GAME_PLAYER];			//积分信息
	SCORE							wlDeskGameScore[GAME_PLAYER];		//累计游戏积分
	TCHAR							szGameRoomName[LEN_SERVER];			//房间名称
};

//叫分状态
struct CMD_S_StatusCall
{
	//游戏信息
	LONGLONG							lCellScore;							//单元积分
	WORD							wCurrentUser;						//当前玩家
	BYTE							cbBankerScore;						//庄家叫分
	BYTE							cbScoreInfo[GAME_PLAYER];			//叫分信息
	BYTE							cbHandCardData[NORMAL_COUNT];		//手上扑克
	BYTE							cbCallScoreMode;					//1叫地主2抢地主

	//历史积分
	SCORE							lTurnScore[GAME_PLAYER];			//积分信息
	SCORE							lCollectScore[GAME_PLAYER];			//积分信息
	SCORE							wlDeskGameScore[GAME_PLAYER];		//累计游戏积分
	TCHAR							szGameRoomName[LEN_SERVER];			//房间名称
};

//游戏状态
struct CMD_S_StatusPlay
{
	//游戏变量
	LONGLONG							lCellScore;							//单元积分
	BYTE							cbBombCount;						//炸弹次数
	WORD							wBankerUser;						//庄家用户
	WORD							wCurrentUser;						//当前玩家
	BYTE							cbBankerScore;						//庄家叫分

	//出牌信息
	WORD							wTurnWiner;							//胜利玩家
	BYTE							cbTurnCardCount;					//出牌数目
	BYTE							cbTurnCardData[MAX_COUNT];			//出牌数据

	//扑克信息
	BYTE							cbBankerCard[BANKER_COUNT];			//游戏底牌
	BYTE							cbHandCardData[MAX_COUNT];			//手上扑克
	BYTE							cbHandCardCount[GAME_PLAYER];		//扑克数目

	//历史积分
	SCORE							lTurnScore[GAME_PLAYER];			//积分信息
	SCORE							lCollectScore[GAME_PLAYER];			//积分信息
	SCORE							wlDeskGameScore[GAME_PLAYER];		//累计游戏积分
	TCHAR							szGameRoomName[LEN_SERVER];			//房间名称
	int								cbJokerO;
};

//发送扑克
struct CMD_S_GameStart
{
	WORD							wStartUser;							//开始玩家
	WORD				 			wCurrentUser;						//当前玩家
	BYTE							cbValidCardData;					//明牌扑克
	BYTE							cbValidCardIndex;					//明牌位置
	BYTE							cbIsGetLandlord;					//抢地主0 叫地主1
	BYTE							cbCardData[NORMAL_COUNT];			//扑克列表
	LONGLONG							lCellScore;							//单元积分
	SCORE							wlDeskGameScore[GAME_PLAYER];		//累计游戏积分
	int								cbJokerO;
};

//用户叫分
struct CMD_S_CallScore
{
	WORD				 			wCurrentUser;						//当前玩家
	WORD							wCallScoreUser;						//叫分玩家
	BYTE							cbCurrentScore;						//当前叫分
	BYTE							cbUserCallScore;					//上次叫分
	BYTE							cbCallScoreMode;					//1叫地主2抢地主
};

//庄家信息
struct CMD_S_BankerInfo
{
	WORD				 			wBankerUser;						//庄家玩家
	WORD				 			wCurrentUser;						//当前玩家
	BYTE							cbBankerScore;						//庄家叫分
	BYTE							cbBankerCard[BANKER_COUNT];			//庄家扑克
};

//用户出牌
struct CMD_S_OutCard
{
	BYTE							cbCardCount;						//出牌数目
	WORD				 			wCurrentUser;						//当前玩家
	WORD							wOutCardUser;						//出牌玩家
	BYTE							cbCardType;							//扑克类型
	BYTE							cbCardData[MAX_COUNT];				//扑克列表
};

//放弃出牌
struct CMD_S_PassCard
{
	BYTE							cbTurnOver;							//一轮结束
	WORD				 			wCurrentUser;						//当前玩家
	WORD				 			wPassCardUser;						//放弃玩家
};

//游戏结束
struct CMD_S_GameConclude
{
	//积分变量
	LONGLONG							lCellScore;							//单元积分
	SCORE							lGameScore[GAME_PLAYER];			//游戏积分

	//春天标志
	BYTE							bChunTian;							//春天标志
	BYTE							bFanChunTian;						//春天标志

	//炸弹信息
	BYTE							cbBombCount;						//炸弹个数
	BYTE							cbEachBombCount[GAME_PLAYER];		//炸弹个数

	//游戏信息
	BYTE							cbBankerScore;						//叫分数目
	BYTE							cbCardCount[GAME_PLAYER];			//扑克数目
	BYTE							cbHandCardData[FULL_COUNT];			//扑克列表
	SCORE							wlDeskGameScore[GAME_PLAYER];		//累计游戏积分
};

//////////////////////////////////////////////////////////////////////////////////
//命令定义

#define SUB_C_CALL_SCORE			1									//用户叫分
#define SUB_C_OUT_CARD				2									//用户出牌
#define SUB_C_PASS_CARD				3									//用户放弃
#define SUB_C_TRUSTEE				4									//用户托管
#define  SUB_C_QIANGZHI_INIT 6

//用户叫分
struct CMD_C_QiangZhiInit
{
	BYTE							needInit;						
};

//用户叫分
struct CMD_C_CallScore
{
	BYTE							cbCallScore;						//叫分数目
};

//用户出牌
struct CMD_C_OutCard
{
	BYTE							cbCardCount;						//出牌数目
	BYTE							cbCardData[MAX_COUNT];				//扑克数据
};

#pragma pack()
//////////////////////////////////////////////////////////////////////////

#endif

